﻿using CodeAgent.Host.Functions;
using CodeAgent.Host.Workspace;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Connectors.OpenAI;

#pragma warning disable OPENAI001

#pragma warning disable SKEXP0001

#pragma warning disable SKEXP0110

#pragma warning disable SKEXP0010

namespace CodeAgent.Host.Agents;

public class DockerAgent
{
    public static ChatCompletionAgent CreateDockerAgent(AgentOption option, string connectionId, string model)
    {
        var kernelBuilder = Kernel.CreateBuilder();

        kernelBuilder.Plugins.AddFromType<DockerSkill>();
        kernelBuilder.Plugins.AddFromType<FileFunction>();

        kernelBuilder.AddOpenAIChatCompletion(model, option.Endpoint, option.ApiKey);

        var kernel = kernelBuilder.Build();


        const string reviewAgentName = "DockerAgent";
        string reviewInstruction =
            $"""
             角色名称：DockerAgent
             职责描述：
             您是一位专业的运维专家，擅长使用 Docker 进行容器化操作，熟练掌握 Docker 命令和 Docker容器操作。您能够帮助用户解决与代码构建、代码编译相关的问题。
             - 当其他角色提供了完整的代码实现后，您需要根据用户的需求，将代码部署到 Docker 容器中，并进行测试。
             - 如果代码运行出现问题，您需要通知其他角色进行修改，直到代码能够正常运行，如果需要部署则直接部署。
             - 如果需要进行端口映射，外部端口请以50000起始随机分配，内部端口请以80起始随机分配，格式是 80:50000。
             - 所有的文件和目录操作的工作目录是 {WorkspaceContext.GetWorkspacePath(connectionId)}，您需要在这个目录下进行操作,在构建的时候需要将{WorkspaceContext.GetWorkspacePath(connectionId)} 映射到容器中进行构建。
             - 如果你的工作完成请通知管理员进行审核。
             """;
        var codeReviewAgent = new ChatCompletionAgent()
        {
            Name = reviewAgentName,
            Instructions = reviewInstruction,
            Kernel = kernel,
            Description = "Docker Agent",
            Arguments = new KernelArguments(new OpenAIPromptExecutionSettings()
            {
                FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(),
                Temperature = 0.5
            }),
        };

        return codeReviewAgent;
    }
}